<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="tool" content="leanote-desktop-app">
<title>IPv4首部</title>
<style>
.tab{font-size:12px; margin-bottom: 10px;}
.tab a{cursor:pointer;cursor:pointer;display:inline-block;margin-right:10px;color:#000}#tab-html{color:#ccc}

.content-container .content-html{visibility: hidden;}
.content-container.html .content-markdown{display:none}
.content-container.html .content-html{display:block; visibility: visible;}
.content-container.html #tab-markdown{color:#ccc}
.content-container.html #tab-html{color:#000}
.content-markdown {overflow: auto;}
textarea {display: none;}

*{font-family:"lucida grande","lucida sans unicode",lucida,helvetica,"Hiragino Sans GB","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;}

body {
  margin: 0;
}

/*公用文字样式*/
h1{font-size:30px}h2{font-size:24px}h3{font-size:18px}h4{font-size:14px}
.note-container{
    width:850px; 
    margin:auto;
    padding: 10px 20px;
    box-shadow: 1px 1px 10px #eee;
}
#title {
  margin: 0;
}
table {
    margin-bottom: 16px;
    border-collapse: collapse;
}
table th, table td {
    padding: 6px 13px;
    border: 1px solid #ddd;
}
table th {
    font-weight: bold;
}

table tr {
    background-color: none;
    border-top: 1px solid #ccc;
}
table tr:nth-child(2n) {
    background-color: rgb(247, 247, 249);
}
.mce-item-table, .mce-item-table td, .mce-item-table th, .mce-item-table caption {
  border: 1px solid #ddd;
  border-collapse: collapse;
  padding: 6px 13px;
}
blockquote {
  border-left-width:10px;
  background-color:rgba(128,128,128,0.05);
  border-top-right-radius:5px;
  border-bottom-right-radius:5px;
  padding:15px 20px;
  border-left:5px solid rgba(128,128,128,0.075);
}
blockquote p {
  margin-bottom:1.1em;
  font-size:1em;
  line-height:1.45
}
blockquote ul:last-child,blockquote ol:last-child {
  margin-bottom:0
}
pre {
  padding: 18px;
  background-color: #f7f7f9;
  border: 1px solid #e1e1e8;
  border-radius: 3px;
  display: block;
}
code {
  padding: 2px 4px;
  font-size: 90%;
  color: #c7254e;
  white-space: nowrap;
  background-color: #f9f2f4;
  border-radius: 4px;
}
.footnote {
  vertical-align: top;
  position: relative;
  top: -0.5em;
  font-size: .8em;
}

hr {
  margin:2em 0
}
img {
  max-width:100%;
  display: block;
  margin: auto;
}
pre {
  word-break:break-word
}
p,pre,pre.prettyprint,blockquote {
  margin:0 0 1.1em
}
hr {
  margin:2em 0
}
img {
  max-width:100%
}
.sequence-diagram,.flow-chart {
  text-align:center;
  margin-bottom:1.1em
}
.sequence-diagram text,.flow-chart text {
  font-size:15px !important;
  font-family:"Source Sans Pro",sans-serif !important
}
.sequence-diagram [fill="#ffffff"],.flow-chart [fill="#ffffff"] {
  fill:#f6f6f6
}
.sequence-diagram [stroke="#000000"],.flow-chart [stroke="#000000"] {
  stroke:#3f3f3f
}
.sequence-diagram text[stroke="#000000"],.flow-chart text[stroke="#000000"] {
  stroke:none
}
.sequence-diagram [fill="#000"],.flow-chart [fill="#000"],.sequence-diagram [fill="#000000"],.flow-chart [fill="#000000"],.sequence-diagram [fill="black"],.flow-chart [fill="black"] {
  fill:#3f3f3f
}
ul,ol {
  margin-bottom:1.1em
}
ul ul,ol ul,ul ol,ol ol {
  margin-bottom:1.1em
}
kbd {
  padding:.1em .6em;
  border:1px solid rgba(63,63,63,0.25);
  -webkit-box-shadow:0 1px 0 rgba(63,63,63,0.25);
  box-shadow:0 1px 0 rgba(63,63,63,0.25);
  font-size:.7em;
  font-family:sans-serif;
  background-color:#fff;
  color:#333;
  border-radius:3px;
  display:inline-block;
  margin:0 .1em;
  white-space:nowrap
}
.toc ul {
  list-style-type:none;
  margin-bottom:15px
}
.m-todo-item {
  list-style: none;
}
pre code {
  padding: 0;
  color: inherit;
  white-space: pre-wrap;
  background-color: inherit;
  border-radius: 0;
}
</style>
<!-- 该css供自定义样式 -->
<link href="../leanote-markdown.css" rel="stylesheet">
</head>

<body>

	<div class="note-container">
		<h1 class="title" id="leanote-title">IPv4首部</h1>
		<div class="content-container html" id="content-container">
			<!-- 切换 -->
			<div class="tab"><a id="tab-markdown">Markdown</a><a id="tab-html">HTML</a></div>
			<textarea id="leanote-content-markdown">IP首部中包含着用于IP协议进行发包控制时所有的必要信息。
![](IPv4首部_files/5971afe0bcb7fc31cb000005.png)

- 版本（Version）
由4比特构成，表示标识IP首部的版本号。IPv4的版本号即为4，因此在这个字段上的值也是“4”。关于IP的所有版本在下表中列出：

![](IPv4首部_files/5971b019bcb7fc31cb000006.png)

- 首部长度（IHL：Internet Header Length）
这个4位字段定义了数据报首部的长度，以4字节的字为单位。
当首部没有选项时，首部长度位20字节；当这个字段值位最大值F时，首部长度最大为60字节。

- 区分服务（TOS：Type Of Service）
由8比特构成，用来表明服务质量。每一位的拘役含义如下：
![](IPv4首部_files/5971b08abcb7fc31cb000007.png)

> 由于实现TOS控制极其复杂,所以有人提出将TOS字段划分为DSCP和ECN两个字段。

- DSCP段与ECN段

![](IPv4首部_files/5971b102bcb7fc31cb000008.png)

    DSCP（Differential Services Codeponit，差分服务代码点）是TOS（Type Of Service）的一部分。现在统称为DiffServ，用来进行质量控制。
    ECN（Explicit Congestion Notification，显式拥塞通告）。
    
    
- 总长度（Total Length）

表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度为65535（2^16）字节。

目前还不存在能够传输最大长度的65535字节的IP包的数据链路。不过，由于有IP分片处理，从IP的上一层角度看，不论底层采用何种数据链路，都可以认为能够以IP的最大包长传输数据。

- 标识（ID：Identification）

由16毕腾构成，用于分片重组。用以分片的标识值相同，不同分片的标识值不同。通常，每发送一个IP包，它的值也逐渐增长。此外，即使IP相同，如果目标地址、源地址或协议不同的话，也会被认为是不同的分片。

- 标志（Flags）

由3比特构成。
![](IPv4首部_files/5971b335bcb7fc31cb000009.png)

-  片偏移（FO ：Fragment Offset）

由13比特构成，用来标识被分片的每一个分段相对于原始数据的位置。

- 生成时间（TTL：Time To Live）

由8比特构成，它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。然而，在实际中它是指可以中转多少个路由器的意思。每经过一个路由器，TTL会减少1，直到变成0则丢弃该包。

- 协议（Protocol）

由8比特构成，标识IP首部的下一个首部隶属于哪个协议。常用的协议如下表：

![](IPv4首部_files/5971b446bcb7fc31cb00000a.png)
![](IPv4首部_files/5971b461bcb7fc31cb00000b.png)

- 首部校验和

当发送 IP 包时，需要计算 IP 报头的校验和：

    把校验和字段置为 0 ； 
    对 IP 头部中的每 16bit 进行二进制求和； 
    如果和的高 16bit 不为 0 ，则将和的高 16bit 和低 16bit 反复相加，直到和的高 16bit 为 0 ，从而获得一个 16bit 的值； 
    将该 16bit 的值取反，存入校验和字段。

当接收 IP 包时，需要对报头进行确认，检查 IP 头是否有误，算法同上 2 、 3 步，然后判断取反的结果是否为 0 ，是则正确，否则有错。

- 源IP地址（Source Address）
- 目的IP地址（Destination Address）
- 可选项（Options）
长度可变，同时只有进行实验和诊断时候使用
    - 安全级别
    - 源路径
    - 路径记录
    - 时间戳

- 填充（Padding）
- 数据（Data）
    </textarea>
			<!-- markdown -->
			<pre class="content-markdown">IP首部中包含着用于IP协议进行发包控制时所有的必要信息。
![](IPv4首部_files/5971afe0bcb7fc31cb000005.png)

- 版本（Version）
由4比特构成，表示标识IP首部的版本号。IPv4的版本号即为4，因此在这个字段上的值也是“4”。关于IP的所有版本在下表中列出：

![](IPv4首部_files/5971b019bcb7fc31cb000006.png)

- 首部长度（IHL：Internet Header Length）
这个4位字段定义了数据报首部的长度，以4字节的字为单位。
当首部没有选项时，首部长度位20字节；当这个字段值位最大值F时，首部长度最大为60字节。

- 区分服务（TOS：Type Of Service）
由8比特构成，用来表明服务质量。每一位的拘役含义如下：
![](IPv4首部_files/5971b08abcb7fc31cb000007.png)

> 由于实现TOS控制极其复杂,所以有人提出将TOS字段划分为DSCP和ECN两个字段。

- DSCP段与ECN段

![](IPv4首部_files/5971b102bcb7fc31cb000008.png)

    DSCP（Differential Services Codeponit，差分服务代码点）是TOS（Type Of Service）的一部分。现在统称为DiffServ，用来进行质量控制。
    ECN（Explicit Congestion Notification，显式拥塞通告）。
    
    
- 总长度（Total Length）

表示IP首部与数据部分合起来的总字节数。该字段长16比特。因此IP包的最大长度为65535（2^16）字节。

目前还不存在能够传输最大长度的65535字节的IP包的数据链路。不过，由于有IP分片处理，从IP的上一层角度看，不论底层采用何种数据链路，都可以认为能够以IP的最大包长传输数据。

- 标识（ID：Identification）

由16毕腾构成，用于分片重组。用以分片的标识值相同，不同分片的标识值不同。通常，每发送一个IP包，它的值也逐渐增长。此外，即使IP相同，如果目标地址、源地址或协议不同的话，也会被认为是不同的分片。

- 标志（Flags）

由3比特构成。
![](IPv4首部_files/5971b335bcb7fc31cb000009.png)

-  片偏移（FO ：Fragment Offset）

由13比特构成，用来标识被分片的每一个分段相对于原始数据的位置。

- 生成时间（TTL：Time To Live）

由8比特构成，它最初的意思是以秒为单位记录当前包在网络上应该生存的期限。然而，在实际中它是指可以中转多少个路由器的意思。每经过一个路由器，TTL会减少1，直到变成0则丢弃该包。

- 协议（Protocol）

由8比特构成，标识IP首部的下一个首部隶属于哪个协议。常用的协议如下表：

![](IPv4首部_files/5971b446bcb7fc31cb00000a.png)
![](IPv4首部_files/5971b461bcb7fc31cb00000b.png)

- 首部校验和

当发送 IP 包时，需要计算 IP 报头的校验和：

    把校验和字段置为 0 ； 
    对 IP 头部中的每 16bit 进行二进制求和； 
    如果和的高 16bit 不为 0 ，则将和的高 16bit 和低 16bit 反复相加，直到和的高 16bit 为 0 ，从而获得一个 16bit 的值； 
    将该 16bit 的值取反，存入校验和字段。

当接收 IP 包时，需要对报头进行确认，检查 IP 头是否有误，算法同上 2 、 3 步，然后判断取反的结果是否为 0 ，是则正确，否则有错。

- 源IP地址（Source Address）
- 目的IP地址（Destination Address）
- 可选项（Options）
长度可变，同时只有进行实验和诊断时候使用
    - 安全级别
    - 源路径
    - 路径记录
    - 时间戳

- 填充（Padding）
- 数据（Data）
    </pre>
			<!-- html -->
			<div class="content-html" id="leanote-content-html"></div>
		</div>
	</div>

<!-- 该js供其它处理 -->
<script src="../leanote-markdown.js"></script>
<script src="http://leanote.github.io/markdown-to-html/markdown-to-html.min.js"></script>
<script>
function init() {
	markdownToHtml(document.getElementById('leanote-content-markdown').value, document.getElementById('leanote-content-html'), function(html) {
		// 解析后执行
		if(window.markdownParsed) {
			window.markdownParsed(html);
		}
	});
	var $m = document.getElementById('tab-markdown');
	var $h = document.getElementById('tab-html');
	var $cc = document.getElementById('content-container');
	function toggleToHtml(isToHtml) {
		$cc.className = isToHtml ? 'content-container html' : 'content-container';
	}
	$m.addEventListener('click', function() {
		toggleToHtml(false);
	});
	$h.addEventListener('click', function() {
		toggleToHtml(true);
	});
}

// 如果不要自动解析html, notParseMarkdown在leanote-markdown.js中定义
if(!window.notParseMarkdown) {
	init();
}
</script>
</body>
</html>